package com.singleton.demo01;

/**
 * 懒汉式单例,采用双重检查,据说有问题:原因在于,在Java编译器中,LazySingleton2 类的初始化与instance 变量赋值的顺序不可预料.(指令重排?)
 *
 * 以上观点是从一本书上看到的,但我个人观点这种双重检查是没有问题的.后面看如何验证下.
 */
public class LazySingleton2 {
    private static LazySingleton2 instance = null;

    private LazySingleton2(){}

    public static LazySingleton2 getInstance() {
        if (instance == null) {
            // 双重检查存在首次多线程同时进入这里,会阻塞在这里进行同步,对于后期就不存在该问题(在一个if判断时就不为null了)
            synchronized (LazySingleton2.class) {
                // 首次第一个线程在创建完实例并返回前,其它线程是必须要等待第一个线程返回
                if (instance == null) {
                    instance = new LazySingleton2();
                }
            }
        }
        return instance;
    }
}
